#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <cstdio>
#include <cstring>
#include <fcntl.h>
#include <signal.h>
#include <pthread.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <vector>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <functional>
#include <semaphore.h>
#include <jsoncpp/json/json.h>
#include <sys/select.h>

using namespace std;
void GetQueryString(string &query_string)
{
    string method = getenv("METHOD");
    if (method == "GET")
    {
        // 获取参数
        query_string = getenv("QUERY_STRING");
    }
    else if (method == "POST")
    {
        // 获取报文长度信息
        int content_length = atoi(getenv("CONTENT_LENGTH"));
        while (content_length)
        {
            char ch;
            read(0, &ch, 1);
            query_string.push_back(ch);
            content_length--;
        }
    }
    else
    {
        // nothing do
    }
}
bool CutString(string &in, const string &sep, string &out1, string &out2)
{
    int pos = in.find(sep);
    if (pos != string::npos)
    {
        out1 = in.substr(0, pos);
        out2 = in.substr(pos + sep.size());
        return true;
    }
    return false;
}
int main()
{
    string query_string;
    GetQueryString(query_string);
    string query_string1;
    string query_string2;
    CutString(query_string, "&", query_string1, query_string2);
    string name1;
    string value1;
    string name2;
    string value2;
    CutString(query_string1, "=", name1, value1);
    CutString(query_string2, "=", name2, value2);
    //因为1号管道(标准输出)被重定向了，因此cout的数据被输入到管道中
    cout << name1 << ":" << value1 << endl;
    cout << name2 << ":" << value2 << endl;
    //想到在可执行程序中输出cout，就用标准错误cerr，因为标准错误的管道没有被重定向
    cerr << name1 << ":" << value1 << endl;
    cerr << name2 << ":" << value2 << endl;
    return 0;
}